package top.lshaci.learning.jvm.string;

/**
 * StringNewTest
 *
 * @author lshaci
 * @date 2020/7/16 16:53
 * @since 1.0.0
 */
public class StringNewTest {

    public static void main(String[] args) {
        /**
         * new String("ab")会创建几个对象？两个对象
         *      一：new关键字在堆空间创建的
         *      二：字符串常量池中的 "ab"；字节码指令ldc
         *  0 new #2 <java/lang/String>
         *  3 dup
         *  4 ldc #3 <ab>
         *  6 invokespecial #4 <java/lang/String.<init>>
         *  9 astore_1
         */
        String s = new String("ab");

        /**
         * new String("a") + new String("b")会创建几个对象？六个对象
         *      一：new StringBuilder()
         *      二：new String("a")
         *      三：字符串常量池中的 "a"
         *      四：new String("b")
         *      五：字符串常量池中的 "b"
         * 深入剖析：StringBuilder的toString();
         *      六：new String("ab")
         *      强调：toString()的调用，在字符串常量池中，没有生成"ab"
         *
         *      10 new #5 <java/lang/StringBuilder>
         *      13 dup
         *      14 invokespecial #6 <java/lang/StringBuilder.<init>>
         *      17 new #2 <java/lang/String>
         *      20 dup
         *      21 ldc #7 <a>
         *      23 invokespecial #4 <java/lang/String.<init>>
         *      26 invokevirtual #8 <java/lang/StringBuilder.append>
         *      29 new #2 <java/lang/String>
         *      32 dup
         *      33 ldc #9 <b>
         *      35 invokespecial #4 <java/lang/String.<init>>
         *      38 invokevirtual #8 <java/lang/StringBuilder.append>
         *      41 invokevirtual #10 <java/lang/StringBuilder.toString>
         *      44 astore_2
         */
        String str = new String("a") + new String("b");
    }
}
